home *** CD-ROM | disk | FTP | other *** search
/ Merciful 1 / Merciful - Disc 1.iso / software / g / gvp_faaast_prep / gvpfaastprep.dms / gvpfaastprep.adf / ScsiExamples / ScsiExamples.lzh / RewindTape.c < prev   
C/C++ Source or Header  |  1990-07-05  |  5KB  |  214 lines

  1. /*
  2. ** RewindTape.c - rewind all SCSI tape units
  3. ** Copyright (C) 1990 by Ralph Babel, Falkenweg 3, D-6204 Taunusstein, FRG
  4. ** all rights reserved - alle Rechte vorbehalten
  5. **
  6. ** 05-Jul-1990 created
  7. */
  8.  
  9. /*** included files ***/
  10.  
  11. #include <exec/types.h>
  12. #include <exec/io.h>
  13. #include <exec/memory.h>
  14. #include <devices/scsidisk.h>
  15. #include <libraries/dos.h>
  16. #include <proto/exec.h>
  17. #include <proto/dos.h>
  18.  
  19. /*** external symbol references ***/
  20.  
  21. void fprintf(BPTR, const char *, ...);
  22.  
  23. /*** constants ***/
  24.  
  25. #define MAXBUF 252
  26.  
  27. /*** structures ***/
  28.  
  29. struct InquiryData
  30.  {
  31.  UBYTE DeviceType;
  32.  UBYTE Qualifier;
  33.  UBYTE Version;
  34.  UBYTE Reserved;
  35.  };
  36.  
  37. /*** entry point (RXStartUp.obj) ***/
  38.  
  39. void __stdargs __saveds main(
  40. ULONG argc,
  41. const char *const argv[])
  42.  {
  43.  BPTR fh;
  44.  UBYTE *sensedata;
  45.  struct MsgPort *mp;
  46.  struct IOStdReq *io;
  47.  struct InquiryData *id;
  48.  ULONG unit;
  49.  struct SCSICmd SC;
  50.  UBYTE command[6];
  51.  
  52.  if(argc != 0) /* CLI only! */
  53.   {
  54.   fh = Output();
  55.  
  56.   if((id = AllocMem(sizeof(struct InquiryData), MEMF_CHIP)) != NULL)
  57.    {
  58.    if((sensedata = AllocMem(MAXBUF, MEMF_CHIP)) != NULL)
  59.     {
  60.     if((mp = CreatePort(NULL, 0)) != NULL)
  61.      {
  62.      if((io = CreateStdIO(mp)) != NULL)
  63.       {
  64.       for(unit = 0; unit <= 6; ++unit)
  65.        {
  66.        fprintf(fh, "Unit %ld\n", unit);
  67.  
  68.        if(OpenDevice("gvpscsi.device", unit, (struct IORequest *)io, 0) == 0)
  69.         {
  70.         io->io_Command = HD_SCSICMD;
  71.         io->io_Length  = sizeof(struct SCSICmd);
  72.         io->io_Data    = (APTR)&SC;
  73.  
  74.         SC.scsi_Data        = (UWORD *)id;
  75.         SC.scsi_Length      = sizeof(struct InquiryData);
  76.         SC.scsi_Command     = command;
  77.         SC.scsi_CmdLength   = 6;
  78.  
  79. #ifdef SCSIF_AUTOSENSE
  80.  
  81.         SC.scsi_Flags       = SCSIF_READ | SCSIF_AUTOSENSE;
  82.         SC.scsi_SenseData   = sensedata;
  83.         SC.scsi_SenseLength = MAXBUF;
  84.         SC.scsi_SenseActual = 0;
  85.  
  86. #else
  87.  
  88.         SC.scsi_Flags       = SCSIF_READ;
  89.  
  90. #endif
  91.  
  92.         command[0] = 0x12; /* SCSI_INQUIRY */
  93.         command[1] = (unit / 10) % 10 << 5;
  94.         command[2] = 0;
  95.         command[3] = 0;
  96.         command[4] = sizeof(struct InquiryData);
  97.         command[5] = 0;
  98.  
  99.         (void)DoIO((struct IORequest *)io);
  100.  
  101.         fprintf(fh, "io_Error         = %d\n",  io->io_Error);
  102.         fprintf(fh, "scsi_Status      = %d\n",  SC.scsi_Status);
  103.         fprintf(fh, "scsi_CmdActual   = %d\n",  SC.scsi_CmdActual);
  104.         fprintf(fh, "scsi_Actual      = %ld\n", SC.scsi_Actual);
  105.  
  106. #ifdef SCSIF_AUTOSENSE
  107.  
  108.         fprintf(fh, "scsi_SenseActual = %d\n",  SC.scsi_SenseActual);
  109.  
  110.         if(SC.scsi_SenseActual != 0)
  111.          {
  112.          UWORD i;
  113.  
  114.          fprintf(fh, "\nSenseData:");
  115.  
  116.          for(i = 0; i < SC.scsi_SenseActual; ++i)
  117.           fprintf(fh, " %02x", sensedata[i]);
  118.  
  119.          fprintf(fh, "\n");
  120.          }
  121.  
  122. #endif
  123.  
  124.         if(io->io_Error == 0
  125.         && SC.scsi_Actual >= 1
  126.         && id->DeviceType == 0x01) /* sequential-access device */
  127.          {
  128.          io->io_Command = HD_SCSICMD;
  129.          io->io_Length  = sizeof(struct SCSICmd);
  130.          io->io_Data    = (APTR)&SC;
  131.  
  132.          SC.scsi_Data        = NULL;
  133.          SC.scsi_Length      = 0;
  134.          SC.scsi_Command     = command;
  135.          SC.scsi_CmdLength   = 6;
  136.  
  137. #ifdef SCSIF_AUTOSENSE
  138.  
  139.          SC.scsi_Flags       = SCSIF_READ | SCSIF_AUTOSENSE;
  140.          SC.scsi_SenseData   = sensedata;
  141.          SC.scsi_SenseLength = MAXBUF;
  142.          SC.scsi_SenseActual = 0;
  143.  
  144. #else
  145.  
  146.          SC.scsi_Flags       = SCSIF_READ;
  147.  
  148. #endif
  149.  
  150.          command[0] = 0x01; /* REWIND */
  151.          command[1] = (unit / 10) % 10 << 5;
  152.          command[2] = 0;
  153.          command[3] = 0;
  154.          command[4] = 0;
  155.          command[5] = 0;
  156.  
  157.          (void)DoIO((struct IORequest *)io);
  158.  
  159.          fprintf(fh, "io_Error         = %d\n",  io->io_Error);
  160.          fprintf(fh, "scsi_Status      = %d\n",  SC.scsi_Status);
  161.          fprintf(fh, "scsi_CmdActual   = %d\n",  SC.scsi_CmdActual);
  162.          fprintf(fh, "scsi_Actual      = %ld\n", SC.scsi_Actual);
  163.  
  164. #ifdef SCSIF_AUTOSENSE
  165.  
  166.          fprintf(fh, "scsi_SenseActual = %d\n",  SC.scsi_SenseActual);
  167.  
  168.          if(SC.scsi_SenseActual != 0)
  169.           {
  170.           UWORD i;
  171.  
  172.           fprintf(fh, "\nSenseData:");
  173.  
  174.           for(i = 0; i < SC.scsi_SenseActual; ++i)
  175.            fprintf(fh, " %02x", sensedata[i]);
  176.  
  177.           fprintf(fh, "\n");
  178.           }
  179.  
  180. #endif
  181.  
  182.          }
  183.  
  184.         fprintf(fh, "\n");
  185.  
  186.         CloseDevice((struct IORequest *)io);
  187.         }
  188.        else
  189.         fprintf(fh, "Error %d while opening SCSI unit %ld.\n",
  190.          io->io_Error, unit);
  191.        }
  192.  
  193.       DeleteStdIO(io);
  194.       }
  195.      else
  196.       fprintf(fh, "Could not create I/O request.\n");
  197.  
  198.      DeletePort(mp);
  199.      }
  200.     else
  201.      fprintf(fh, "Could not create message port.\n");
  202.  
  203.     FreeMem(sensedata, MAXBUF);
  204.     }
  205.    else
  206.     fprintf(fh, "Insufficient free store.\n");
  207.  
  208.    FreeMem(id, sizeof(struct InquiryData));
  209.    }
  210.   else
  211.    fprintf(fh, "Insufficient free store.\n");
  212.   }
  213.  }
  214.